const express = require('express')
const app = express()

// 中间件的顺序很重要
// req 请求对象
// res 响应对象
// next 下一个中间件

// 1.应用中间件 （不关心请求路径）
app.use((req, res, next) => {
  console.log('应用中间件')
  next()
})

// 2.内置中间件
// 配置解析表单请求体：application/json
app.use(express.json())
// 解析表单请求体：application/x-www-form-urlencoded
app.use(express.urlencoded())

// 3.路由中间件
app.use(
  '/api',
  (req, res, next) => {
    console.log('API路由中间件')
    next()
  },
  (req, res, next) => {
    console.log('可以写多个函数1')
    next()
  },
  (req, res, next) => {
    console.log('可以写多个函数2')
    next()
  }
)

// 路由2
app.get('/', async (req, res, next) => {
  try {
    res.json({ data: 'get /' })
  } catch (err) {
    // 如果将任何内容传递给next() 函数（字符串'route'除外），Express都会将当前请求视为错误，并且将跳过所有剩余的无错误处理路由和中间件函数。
    // next() 往后匹配下一个中间件
    // next('route') 往后匹配当前中间件堆栈中的下一个
    next(err) // 跳过所有剩余的无错误处理路由和中间件函数。
  }
})

// 路由2
app.get('/api/data', (req, res, next) => {
  try {
    res.json({ data: 'get /api/data' })
  } catch (error) {
    next(error)
  }
})

// 处理 404 的内容
app.use((req, res, next) => {
  res.status(404).send('404 Not Found.')
})

// 4.错误处理中间件（在所有的中间件之后挂）
app.use((err, req, res, next) => {
  // 4个参数缺一不可
  // console.log('错误', err)
  res.status(500).json({
    error: err.message
  })
})

app.listen(3000, () => {
  console.log(`Server running at http://localhost:3000/`)
})
